// 程序的调试帮助：assert和NDEBUG

// 知识点1：预处理宏assert(expr)：包含一个表达式，expr为真时，assert什么也不做，为假时输出信息并终止程序。包含在cassert头文件中。通常用于检查不能发生的条件

// 知识点2：assert依赖于一个NDEBUG的预处理变量的状态，如果定义了NDEBUG，assert什么也不做，默认状态下NDEBUG是未定义的。编译器也可以预先定义该变量。

// 知识点3：也可以使用NDEBUG编写自己的条件调试代码，如果NDEBUG未定义，将执行#ifndef到#endif之间的代码，如果定义了NDEBUG，这些代码将被忽略。
#include <iostream>
#include <string>
#include <vector>
using namespace std;
void printVec(vector<int> &vec) {
#ifndef NDEBUG
  cout << "vector size: " << vec.size() << endl;
#endif
  if (!vec.empty()) {
    auto tmp = vec.back();
    vec.pop_back();
    printVec(vec);
    cout << tmp << " ";
  }
}

void pp() {
#ifndef NDEBUG
  cerr << "my name is:" << __func__ << endl;
#endif
  //其他代码
}

int main(int argc, char **argv) {
  vector<int> vec{1, 2, 3, 4, 5, 6, 7, 8, 9}; // c++11特性
  printVec(vec);
  cout << endl;
  pp();
  return 0;
}
